// 对应model中的User
package v1

import (
	"github.com/gin-gonic/gin"
	"goblog/model"
	"goblog/utils/errmsg"
	"goblog/utils/validator"
	"net/http"
	"strconv"
)

var code int

// 查询用户是否存在
//已经不用了功能在添加用户内实现了model.CheckUser

// 添加用户

func AddUser(c *gin.Context) {
	var data model.User
	var msg string
	_ = c.ShouldBindJSON(&data)
	msg, code = validator.Validate(&data) //添加用户时验证
	if code != errmsg.SUCCESS {
		c.JSON(http.StatusOK, gin.H{
			"status":  code,
			"message": msg,
		})
		return
	}

	code = model.CheckUser(data.Username)
	if code == errmsg.SUCCESS {
		model.CreateUser(&data)
	}
	if code == errmsg.ERROR_USERNAME_USED {
		code = errmsg.ERROR_USERNAME_USED
	} //1001
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"data":    data,
		"message": errmsg.GetErrMsg(code),
	}) //返回一个JSON
}

//查询单个用户

// 查询用户列表

func GetUsers(c *gin.Context) {
	pageSize, _ := strconv.Atoi(c.Query("pagesize")) //用Query接收pageSize但是Query会接收成为String在User中pageSize是int所以要做一个类型转换
	pageNum, _ := strconv.Atoi(c.Query("pagenum"))   //因为strconv.Atoi还会返回一个string所以用_不接收string

	if pageSize == 0 { //如果Size = 0那就不要分页功能
		pageSize = -1 //-1就是Limit不做限制
	}
	if pageNum == 0 {
		pageNum = 1 //Offset偏移量也是-1不不偏移
	}
	data, total := model.GetUsers(pageSize, pageNum) //用data去接收GetUsers其中Size和Num都是切片
	code := errmsg.SUCCESS
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"data":    data,
		"total":   total,
		"message": errmsg.GetErrMsg(code), //输出这个字符串
	}) //返回一个JSON
}

// 编辑用户
//编辑用户时要先进行查询不能出现同名的情况

func EditUser(c *gin.Context) {
	var data model.User
	_ = c.ShouldBindJSON(&data)
	id, _ := strconv.Atoi(c.Param("id"))  //接收id
	code = model.CheckUser(data.Username) //CheckUser其实也是在updata之前的所以说也可以用钩子函数来实现
	if code == errmsg.SUCCESS {
		model.EditUser(id, &data)
	}
	if code == errmsg.ERROR_USERNAME_USED {
		c.Abort() //直接返回
	} //1001
	c.JSON(http.StatusOK, gin.H{
		"status": code,
		//"data":    data,不用返回data
		"message": errmsg.GetErrMsg(code),
	}) //返回一个JSON)
}

// 删除用户

func DeleteUser(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	code = model.DeleteUser(id)  // 接收再传入id
	c.JSON(http.StatusOK, gin.H{ //这里不用去if判断code直接JSON返回就好
		"status":  code,
		"message": errmsg.GetErrMsg(code),
	})
}
